Navigasi: atau klik
BAB 7 • Front-End Masterclass

Database
Relational Design

Merancang fondasi data aplikasi nyata — relasi, ERD, dan normalisasi — untuk membangun sistem yang rapi, cepat, dan tahan lama.

1 : 1
N : N
1 : N
ERD
PK
FK
🔗 Relasi Tabel 📊 ERD 🧹 Normalisasi 🛒 Mini Project E-Commerce

Kelas 10 SMK/SMA IT • Semester 2 • Tekan untuk mulai

Peta Materi

Tujuan Pembelajaran

Setelah bab ini, kamu akan mampu merancang database aplikasi nyata dari nol.

🔗

Memahami Relasi

Membedakan One-to-One, One-to-Many, dan Many-to-Many beserta contohnya.

📊

Membaca ERD

Mengenal simbol & komponen ERD, lalu membacanya tanpa bantuan guru.

🧹

Normalisasi

Mengidentifikasi 1NF, 2NF, dan 3NF pada sebuah tabel.

🧱

Merancang Schema

Membuat relasi User, Produk, Kategori, dan Transaksi.

🛒

Mini Project

Menyusun ERD E-Commerce dengan minimal 4 entitas.

🧪

Latihan & Tugas

Menyelesaikan 2 latihan interaktif + 1 tugas mandiri.

Relasi ERD Normalisasi Schema Nyata 🛒 ERD E-Commerce
Konsep Dasar

Apa itu Database Relational?

Bayangkan sebuah lemari arsip sekolah. Setiap laci punya tema: laci Siswa, laci Kelas, laci Nilai.

Database relational = banyak tabel (laci) yang saling terhubung. Tabel nilai tahu milik siswa siapa karena ada nomor identitas yang sama.

Penghubung itu namanya Key: Primary Key (PK) = identitas unik, Foreign Key (FK) = penunjuk ke tabel lain.

Analogi Nyata

siswa_id (PK)nama
1Budi
2Sari
🔗 dihubungkan oleh siswa_id
nilai_id (PK)siswa_id (FK)nilai
10190
11285
💡 Kenapa dipisah? Supaya data tidak berulang (boros & rawan salah). Satu data, satu tempat — lalu dihubungkan lewat key.
Jenis Relasi 1 / 3

One To One (1 : 1)

Satu data di tabel A hanya berpasangan dengan tepat satu data di tabel B.

Analogi: Orang ↔ KTP

1 Orang
punya1 : 1
KTP • 3201... 1 KTP

1 orang punya tepat 1 KTP, dan 1 KTP dimiliki tepat 1 orang. ✨

Contoh lain

👤 User ↔ 🪪 Profil Detail · 🏫 Sekolah ↔ 📍 Alamat Utama · 📱 HP ↔ 🔢 Nomor IMEI

Kapan dipakai?

Saat ingin memisahkan data sensitif/jarang dipakai dari tabel utama agar lebih ringan & rapi.

One to One • Implementasi

1 : 1 — Contoh Kode & ERD

schema_one_to_one.sql
-- FK diberi UNIQUE → memaksa 1:1
CREATE TABLE users (
  id       INT PRIMARY KEY,
  nama     VARCHAR(100)
);

CREATE TABLE profil (
  id       INT PRIMARY KEY,
  user_id  INT UNIQUE,  -- kunci 1:1
  bio      TEXT,
  FOREIGN KEY(user_id) REFERENCES users(id)
);

ERD Visual

erDiagram
    USERS ||--|| PROFIL : "memiliki"
    USERS {
      int id PK
      string nama
    }
    PROFIL {
      int id PK
      int user_id FK
      string bio
    }

Simbol ||--|| berarti satu-dan-tepat-satu di kedua sisi.

Jenis Relasi 2 / 3

One To Many (1 : N)

Satu data di tabel A bisa berpasangan dengan banyak data di tabel B.

Analogi: Ibu → Banyak Anak

1 Ibu
punya1 : N
Banyak Anak

1 ibu bisa punya banyak anak — tapi tiap anak hanya punya 1 ibu. 👩‍👧‍👦

🏷️ Kategori → Produk

1 kategori berisi banyak produk.

👤 User → Pesanan

1 user bisa membuat banyak pesanan.

📝 Postingan → Komentar

1 postingan punya banyak komentar.

One to Many • Implementasi

1 : N — Contoh Kode & ERD

one_to_many.sql
CREATE TABLE kategori (
  id     INT PRIMARY KEY,
  nama   VARCHAR(60)
);

CREATE TABLE produk (
  id          INT PRIMARY KEY,
  nama        VARCHAR(100),
  kategori_id INT,  -- FK, TANPA unique
  FOREIGN KEY(kategori_id)
      REFERENCES kategori(id)
);

ERD Visual

erDiagram
    KATEGORI ||--o{ PRODUK : "punya banyak"
    KATEGORI {
      int id PK
      string nama
    }
    PRODUK {
      int id PK
      string nama
      int kategori_id FK
    }

Simbol ||--o{ = satu sisi "1", sisi kaki-gagak "banyak". FK tanpa UNIQUE.

Jenis Relasi 3 / 3

Many To Many (N : N)

Banyak data A bisa terhubung ke banyak data B, dan sebaliknya.

Analogi: Siswa ↔ Mata Pelajaran

👧 Sari
👦 Budi
🧒 Andi
📐 Matematika
💻 Pemrograman
🎨 Desain

1 siswa ambil banyak mapel, & 1 mapel diambil banyak siswa. 🕸️

💡 N:N tidak bisa langsung dihubungkan. Butuh tabel jembatan (pivot) di tengah — kita bahas di slide berikutnya.
Many to Many • Tabel Pivot

N : N — Kode, ERD & Tabel Pivot

many_to_many.sql
CREATE TABLE siswa ( id INT PRIMARY KEY, nama VARCHAR(80) );
CREATE TABLE mapel ( id INT PRIMARY KEY, nama VARCHAR(80) );

-- 🪡 TABEL JEMBATAN / PIVOT
CREATE TABLE siswa_mapel (
  siswa_id INT,
  mapel_id INT,
  PRIMARY KEY(siswa_id, mapel_id),
  FOREIGN KEY(siswa_id) REFERENCES siswa(id),
  FOREIGN KEY(mapel_id) REFERENCES mapel(id)
);

Tabel Pivot: siswa_mapel

siswa_id (FK)mapel_id (FK)
110
111
210
erDiagram
    SISWA ||--o{ SISWA_MAPEL : ikut
    MAPEL ||--o{ SISWA_MAPEL : diambil
Entity Relationship Diagram

ERD — Komponen & Simbol

ERD adalah peta dari database: menunjukkan entitas, atribut, dan relasinya.

🟦

Entitas

Objek/benda yang disimpan, mis. User, Produk. Jadi nama tabel.

🏷️

Atribut

Sifat/kolom entitas, mis. nama, harga, email.

🔑

Primary Key

Atribut unik penanda identitas baris (ditandai PK).

🔗

Foreign Key

Atribut penunjuk ke PK tabel lain (ditandai FK).

Garis Relasi

Menghubungkan 2 entitas yang berhubungan.

🐦

Kardinalitas

Simbol kaki-gagak: jumlah pasangan (1 atau banyak).

Kamus Simbol Kaki-Gagak (Crow's Foot)

||  tepat satu o|  nol atau satu }o  nol atau banyak }|  satu atau banyak
Membaca ERD

Cara Membaca ERD — Langkah demi Langkah

1
Temukan entitasnya. Kotak-kotak persegi = tabel.
2
Cari PK & FK. PK = identitas, FK = penghubung.
3
Ikuti garisnya. Lihat entitas mana terhubung.
4
Baca kardinalitasnya. Ujung garis = 1 atau banyak?
5
Terjemahkan jadi kalimat. "1 User punya banyak Pesanan."

Latihan Baca Bersama

erDiagram
    USER ||--o{ PESANAN : membuat
    PESANAN ||--|{ ITEM : berisi
    PRODUK ||--o{ ITEM : muncul_di
    USER {
      int id PK
      string nama
    }
    PESANAN {
      int id PK
      int user_id FK
    }

📖 Dibaca: "Satu User membuat banyak Pesanan; setiap Pesanan berisi satu atau lebih Item; setiap Item menunjuk satu Produk."

Normalisasi 1 / 3

First Normal Form (1NF)

Aturan: setiap sel berisi satu nilai — tidak ada daftar/kolom berulang.

❌ Belum 1NF

idnamahobi
1Budirenang, coding, gitar
2Sarimembaca, lari

Kolom hobi menumpuk banyak nilai dalam 1 sel. Susah dicari & diurutkan.

✅ Sudah 1NF

idnamahobi
1Budirenang
1Budicoding
1Budigitar
2Sarimembaca

Tiap sel = satu nilai. Atomik & mudah diproses.

Normalisasi 2 & 3 / 3

2NF & 3NF

2NF — Hapus Ketergantungan Parsial

Syarat: sudah 1NF + setiap kolom non-key bergantung pada seluruh primary key (penting saat PK gabungan).

2nf
-- ❌ nama_produk ikut di tabel pivot
order_item(order_id, produk_id, nama_produk, qty)
-- ✅ pisahkan: nama_produk milik tabel produk
order_item(order_id, produk_id, qty)
produk(id, nama_produk)

3NF — Hapus Ketergantungan Transitif

Syarat: sudah 2NF + kolom non-key tidak bergantung pada kolom non-key lain.

3nf
-- ❌ nama_kota bergantung pada kode_pos
user(id, nama, kode_pos, nama_kota)
-- ✅ pisahkan ke tabel kota
user(id, nama, kode_pos)
kota(kode_pos, nama_kota)
🎯 Inti normalisasi: satu fakta disimpan satu kali. Mengurangi duplikasi → data konsisten & hemat.
Schema Nyata 1 / 2

Relasi User & Produk

🧑 Tabel users

kolomtipeket
idINTPK
namaVARCHAR
emailVARCHARUNIQUE
roleENUMuser/admin

📦 Tabel produk

kolomtipeket
idINTPK
namaVARCHAR
hargaDECIMAL
kategori_idINTFK → kategori
erDiagram
    USERS ||--o{ PESANAN : membuat
    KATEGORI ||--o{ PRODUK : mengelompokkan
    USERS {
      int id PK
      string email
    }
    PRODUK {
      int id PK
      int kategori_id FK
    }
Schema Nyata 2 / 2

Relasi Kategori & Transaksi

🏷️ Tabel kategori

kolomtipeket
idINTPK
namaVARCHAR

1 kategori → banyak produk (1 : N).

🧾 Tabel transaksi (pesanan)

kolomtipeket
idINTPK
user_idINTFK → users
tanggalDATE
totalDECIMAL

Detail item disimpan di pivot transaksi_item (N : N produk).

erDiagram
    USERS ||--o{ TRANSAKSI : melakukan
    TRANSAKSI ||--|{ TRANSAKSI_ITEM : memuat
    PRODUK ||--o{ TRANSAKSI_ITEM : terdapat_di
🛒 Mini Project

ERD E-Commerce — Pengantar & Entitas

Kita gabungkan semua konsep menjadi satu rancangan database toko online.

🧑

users

Pembeli & admin. PK: id.

🏷️

kategori

Pengelompokan produk. PK: id.

📦

produk

Barang dijual. FK: kategori_id.

🧾

transaksi

Pesanan. FK: user_id.

🪡

transaksi_item

Pivot N:N transaksi ↔ produk.

review

Ulasan. FK: user_id, produk_id.

🎯 Target: minimal 4 entitas dengan relasi 1:1, 1:N, dan N:N yang benar. Diagram lengkapnya ada di slide berikutnya.
🛒 Mini Project • ERD Lengkap

Diagram ERD E-Commerce

erDiagram
    USERS ||--o{ TRANSAKSI : melakukan
    USERS ||--o{ REVIEW : menulis
    KATEGORI ||--o{ PRODUK : memiliki
    PRODUK ||--o{ REVIEW : menerima
    TRANSAKSI ||--|{ TRANSAKSI_ITEM : memuat
    PRODUK ||--o{ TRANSAKSI_ITEM : terjual_di
    USERS {
      int id PK
      string nama
      string email
    }
    KATEGORI {
      int id PK
      string nama
    }
    PRODUK {
      int id PK
      string nama
      decimal harga
      int kategori_id FK
    }
    TRANSAKSI {
      int id PK
      int user_id FK
      date tanggal
    }
    TRANSAKSI_ITEM {
      int transaksi_id FK
      int produk_id FK
      int qty
    }
    REVIEW {
      int id PK
      int user_id FK
      int produk_id FK
      int rating
    }

Mengandung 1:N (kategori→produk) dan N:N (transaksi↔produk via pivot). ✅

🧪 Latihan 1

Identifikasi Jenis Relasi

Pilih jawaban yang benar. Klik salah satu opsi.

Soal 1: Dalam sistem sekolah, 1 Kelas berisi banyak Siswa, dan tiap Siswa hanya berada di 1 Kelas. Relasi ini adalah…

Soal 2: Penulis dan Buku — 1 penulis bisa menulis banyak buku, dan 1 buku bisa ditulis banyak penulis. Relasi ini butuh…

🧪 Latihan 2

Lengkapi ERD — Cocokkan Relasinya

Pilih jenis relasi yang tepat dari tiap dropdown, lalu tekan Periksa Jawaban.

👤 User ↔ 🪪 Profil (1 user = 1 profil)
🏷️ Kategori ↔ 📦 Produk (1 kategori = banyak produk)
🧾 Transaksi ↔ 📦 Produk (saling banyak, via pivot)
🧑 User ↔ 🧾 Transaksi (1 user = banyak transaksi)
📝 Tugas Mandiri

Buat ERD Sistem Perpustakaan

Rancang ERD untuk sistem peminjaman buku perpustakaan sekolah.

📋 Instruksi

  • 1
    Buat minimal 4 entitas: anggota, buku, kategori, peminjaman.
  • 2
    Tentukan PK tiap entitas dan FK penghubungnya.
  • 3
    Sertakan minimal satu relasi 1:N dan satu relasi N:N.
  • 4
    Pastikan rancangan memenuhi minimal 1NF.
  • 5
    Gambar ERD (Mermaid / kertas) lalu jelaskan relasinya dalam kalimat.

🧩 Template Awal (lengkapi!)

perpustakaan.mmd
erDiagram
  ANGGOTA ||--o{ PEMINJAMAN : "meminjam"
  BUKU    ||--o{ PEMINJAMAN : "dipinjam"
  KATEGORI ||--o{ BUKU : "________"
  -- lengkapi atribut & relasi lainnya
  ANGGOTA { int id PK
    string nama }
  BUKU    { int id PK
    int kategori_id FK }

Kumpulkan: file .mmd / foto ERD + penjelasan 1 paragraf.

Recap • BAB 7 Selesai

Kamu Sekarang Bisa Merancang Database! 🎉

🔗

3 Jenis Relasi

1:1 (Orang↔KTP), 1:N (Ibu→Anak), N:N (Siswa↔Mapel + pivot).

📊

ERD

Entitas, atribut, PK/FK, dan kardinalitas kaki-gagak.

🧹

Normalisasi

1NF atomik · 2NF parsial · 3NF transitif — satu fakta satu kali.

💡 Tips Senior: Sebelum menulis kode, gambar dulu ERD-nya. Database yang dirancang rapi = aplikasi yang mudah dikembangkan dan jarang bug data.

Lanjut ke BAB 8 — implementasi query & API. Tekan untuk mengulang materi.